﻿//Mirco Töpfer

#region Usings
using System;
using System.Collections.Generic;
using System.Data;
using pheidippides.common.Classes;
using pheidippides.configuration.Classes;
using pheidippides.dataaccess.DatabaseStrukturEnumns;
using pheidippides.dataaccess.HelperClasses;
using pheidippides.logging.Classes;
#endregion


namespace pheidippides.dataaccess.Classes
{
    public static class StreckeDataAccess
    {
        #region Public Static Methods

        /// <summary>
        /// Gets all.
        /// </summary>
        /// <param name="veranstaltungGuid">The veranstaltung GUID.</param>
        /// <returns></returns>
        public static List<StreckeData> GetAll(Guid veranstaltungGuid)
        {
            Logger.GetInstance().LogMessage("Hole alle Strecken für Veranstaltung " + veranstaltungGuid + " aus der Datenbank", LogLevel.Debug);
            AccessDbSqlHelper dbHelper = new AccessDbSqlHelper(ConfigManager.GetInstance().GetDatabasePath());

            dbHelper.SetProperty(DbEnumTeilnehmer.veranstaltung_fk, veranstaltungGuid);

            DataTable data = dbHelper.ExecuteQuery("Select * from " + DbEnumTables.strecke + " where " + DbEnumStrecke.veranstaltung_fk + " =@" + DbEnumStrecke.veranstaltung_fk);

            return GetStreckeDataFromDataTable(data);
        }

        /// <summary>
        /// Saves the specified strecke data.
        /// </summary>
        /// <param name="streckeData">The strecke data.</param>
        public static void Save(StreckeData streckeData)
        {
            Logger.GetInstance().LogMessage("Speichere Strecke " + streckeData.Name + " in Datenbank", LogLevel.Debug);

            String sqlCommand;

            if (CheckIfExists(streckeData))
            {
                sqlCommand = "UPDATE " + DbEnumTables.strecke + " SET " +
                             DbEnumStrecke.name + " = @" + DbEnumStrecke.name + ", " +
                             DbEnumStrecke.notiz + " = @" + DbEnumStrecke.notiz + ", " +
                             DbEnumStrecke.startzeit + " = @" + DbEnumStrecke.startzeit + ", " +
                             DbEnumStrecke.veranstaltung_fk + " = @" + DbEnumStrecke.veranstaltung_fk +
                             " WHERE " + DbEnumStrecke.id + "= @" + DbEnumStrecke.id;
            }
            else
            {
                sqlCommand = "INSERT INTO " + DbEnumTables.strecke + " (" +
                             DbEnumStrecke.id + ", " +
                             DbEnumStrecke.name + ", " +
                             DbEnumStrecke.notiz + ", " +
                             DbEnumStrecke.startzeit + ", " +
                             DbEnumStrecke.veranstaltung_fk +
                             ") VALUES (@" +
                             DbEnumStrecke.id + ", @" +
                             DbEnumStrecke.name + ", @" +
                             DbEnumStrecke.notiz + ", @" +
                             DbEnumStrecke.startzeit + ", @" +
                             DbEnumStrecke.veranstaltung_fk +
                             ")";
            }

            AccessDbSqlHelper helper = new AccessDbSqlHelper(ConfigManager.GetInstance().GetDatabasePath());

            helper.SetProperty(DbEnumStrecke.id.ToString(), streckeData.Id);
            helper.SetProperty(DbEnumStrecke.name.ToString(), streckeData.Name);
            helper.SetProperty(DbEnumStrecke.notiz.ToString(), streckeData.Notiz);
            helper.SetProperty(DbEnumStrecke.startzeit.ToString(), streckeData.StartzeitTicks);
            helper.SetProperty(DbEnumStrecke.veranstaltung_fk.ToString(), streckeData.VeranstaltungFk);
            
            helper.ExecuteNonQuery(sqlCommand);
        }


        /// <summary>
        /// Gets the specified id.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <param name="veranstaltungGuid">The veranstaltung GUID.</param>
        /// <returns></returns>
        public static StreckeData Get(Guid id, Guid veranstaltungGuid)
        {
            Logger.GetInstance().LogMessage("Hole Strecke " + id + " für Veranstaltung " + veranstaltungGuid + " aus der Datenbank", LogLevel.Debug);
            AccessDbSqlHelper dbHelper = new AccessDbSqlHelper(ConfigManager.GetInstance().GetDatabasePath());

            dbHelper.SetProperty(DbEnumTeilnehmer.id, id);
            dbHelper.SetProperty(DbEnumTeilnehmer.veranstaltung_fk, veranstaltungGuid);

            DataTable data = dbHelper.ExecuteQuery("Select * from " + DbEnumTables.strecke + " where " + DbEnumStrecke.id + " = @" + DbEnumStrecke.id + " and " + DbEnumStrecke.veranstaltung_fk + " = @" + DbEnumStrecke.veranstaltung_fk);

            if (data.Rows.Count > 1)
                throw new ApplicationException("Die angefragte Strecke gibt es mehr als ein mal in der Datenbank!");

            if (data.Rows.Count == 0)
            {
                Logger.GetInstance().LogMessage("Es konnte in der Datenbank keine Strecke mit der ID " + id + " und der Veranstaltung " + veranstaltungGuid + " gefunden werden!", LogLevel.Warning);
                return null;
            }
            return GetStreckeDataFromRow(data.Rows[0]);
        }

        /// <summary>
        /// Checks if exists.
        /// </summary>
        /// <param name="streckeData">The strecke data.</param>
        /// <returns></returns>
        public static bool CheckIfExists(StreckeData streckeData)
        {            
            AccessDbSqlHelper helper = new AccessDbSqlHelper(ConfigManager.GetInstance().GetDatabasePath());

            helper.SetProperty(DbEnumStrecke.id, streckeData.Id);
            helper.SetProperty(DbEnumStrecke.veranstaltung_fk, streckeData.VeranstaltungFk);

            DataTable data = helper.ExecuteQuery("select count(*) from " + DbEnumTables.strecke + " where " + DbEnumStrecke.id + " = @" + DbEnumStrecke.id + " and " + DbEnumStrecke.veranstaltung_fk + " = @" + DbEnumStrecke.veranstaltung_fk);

            if (Convert.ToInt32(data.Rows[0][0]) == 1)
                return true;

            if (Convert.ToInt32(data.Rows[0][0]) == 0)
                return false;

            throw new ApplicationException("Es sind mehr als eine erwartete Strecke in der Datenbank.");
        }

        /// <summary>
        /// Deletes the specified strecke data.
        /// </summary>
        /// <param name="streckeData">The strecke data.</param>
        public static void Delete(StreckeData streckeData)
        {
            Logger.GetInstance().LogMessage("Lösche Teilnehmer " + streckeData.Id + " für Veranstaltung " + streckeData.VeranstaltungFk + " aus der Datenbank", LogLevel.Debug);
            AccessDbSqlHelper helper = new AccessDbSqlHelper(ConfigManager.GetInstance().GetDatabasePath());

            helper.SetProperty(DbEnumStrecke.id, streckeData.Id);
            helper.SetProperty(DbEnumStrecke.veranstaltung_fk, streckeData.VeranstaltungFk);

            helper.ExecuteNonQuery("delete from " + DbEnumTables.strecke + " where " + DbEnumStrecke.id + " = @" + DbEnumStrecke.id + " and " + DbEnumStrecke.veranstaltung_fk + " = @" + DbEnumStrecke.veranstaltung_fk);
        }

        #endregion

        #region Private Static Methods

        /// <summary>
        /// Gets the strecke data from data table.
        /// </summary>
        /// <param name="data">The data.</param>
        /// <returns></returns>
        private static List<StreckeData> GetStreckeDataFromDataTable(DataTable data)
        {
            Logger.GetInstance().LogMessage("Erzeuge Strecke aus Dataset", LogLevel.Debug);

            List<StreckeData> teilnehmer = new List<StreckeData>();

            foreach (DataRow row in data.Rows)
            {
                teilnehmer.Add(GetStreckeDataFromRow(row));
            }

            return teilnehmer;
        }

        /// <summary>
        /// Gets the strecke data from row.
        /// </summary>
        /// <param name="row">The row.</param>
        /// <returns></returns>
        private static StreckeData GetStreckeDataFromRow(DataRow row)
        {
            Logger.GetInstance().LogMessage("OR Mapping der Strecke", LogLevel.Debug);

            StreckeData data = new StreckeData();

            data.Id = new Guid(row[DbEnumStrecke.id.ToString()].ToString());
            data.Name = row[DbEnumStrecke.name.ToString()].ToString();
            data.Notiz = row[DbEnumStrecke.notiz.ToString()].ToString();
            data.StartzeitTicks = Convert.ToInt64(row[DbEnumStrecke.startzeit.ToString()].ToString());
            data.VeranstaltungFk = new Guid(row[DbEnumStrecke.veranstaltung_fk.ToString()].ToString());
            
            return data;
        }
        #endregion
    }
}
